package org.jsola.hr.service;

import org.jsola.admin.dto.DictItemUpdateDTO;
import org.jsola.admin.entity.DictItemDO;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IProductDAO;
import org.jsola.hr.dto.ProductAddDTO;
import org.jsola.hr.dto.ProductUpdateDTO;
import org.jsola.hr.entity.ProductDO;
import org.jsola.hr.query.ProductQuery;
import org.jsola.hr.vo.ProductListVO;
import org.jsola.hr.vo.ProductVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 产品
 *
 * @author zhr
 */
public interface IProductService extends IService<IProductDAO, ProductDO> {

    /**
     * 新增产品
     *
     * @param productAddDTO 新增产品DTO
     * @param tokenUser     当前用户
     * @return 产品详情信息
     */
    ProductVO save(ProductAddDTO productAddDTO, TokenUser tokenUser);

    /**
     * 修改产品
     *
     * @param productUpdateDTO 修改产品DTO
     * @param tokenUser        当前用户
     * @return 更新数量
     */
    int update(ProductUpdateDTO productUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除产品，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser  当前用户
     * @param productIds 产品id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... productIds);

    /**
     * 根据产品id查找
     *
     * @param productId 产品id
     * @param siteId    所属站点id
     * @return 产品详情信息
     */
    ProductVO selectById(String productId, String siteId);

    /**
     * 根据产品id查找
     *
     * @param productIds 产品ids
     * @param siteId     所属站点id
     * @return 产品详情信息
     */
    List<ProductDO> selectDoByIds(List<String> productIds, String siteId);


    /**
     * 根据产品分类id查找
     *
     * @param productTypeIds 产品分类ids
     * @param siteId         所属站点id
     * @return 产品详情信息
     */
    List<ProductDO> selectDoByProductTypeIds(List<String> productTypeIds, String siteId);

    /**
     * 查询产品
     *
     * @param productQuery 查询条件
     * @param siteId       所属站点id
     * @return 产品列表信息
     */
    List<ProductListVO> select(ProductQuery productQuery, String siteId);

    /**
     * 查询产品记录数
     *
     * @param productQuery 查询条件
     * @param siteId       所属站点id
     * @return 产品记录数
     */
    int selectCount(ProductQuery productQuery, String siteId);

    /**
     * 分页查询产品
     *
     * @param productQuery 查询条件
     * @param siteId       所属站点id
     * @return 产品列表信息
     */
    Page<ProductListVO> selectPage(ProductQuery productQuery, String siteId);


    /**
     * 根据产品id查找
     *
     * @param productId 产品id
     * @param siteId    所属站点id
     * @return 产品
     */
    ProductDO selectDOById(String productId, String siteId);

    /**
     * 查询产品
     *
     * @param productQuery 查询条件
     * @param siteId       所属站点id
     * @return 产品列表
     */
    List<ProductDO> selectDO(ProductQuery productQuery, String siteId);

    /**
     * 查询租户下产品
     *
     * @param siteId       所属站点id
     * @return 产品列表
     */
    List<ProductDO> selectBySite(String siteId);

    /**
     * 查询指定产品分组下产品,传0查全部分组
     *
     * @param productTypeId 产品分组Id
     * @param productName   产品名称(模糊查询)
     * @param pageNo
     * @param pageSize
     * @param siteId        站点Id
     * @return 指定产品分组下产品, 传0查全部分组
     */
    Page<ProductDO> selectByProductTypeIdAndProductName(String productTypeId, String productName, Integer pageNo, Integer pageSize, String siteId);

    /**
     * 更新dict
     *
     * @param dictItem          查询结果(修改前)
     * @param dictItemUpdateDTO 更新内容(修改后)
     * @param tokenUser         登录用户
     */
    void updateDict(DictItemDO dictItem, DictItemUpdateDTO dictItemUpdateDTO, TokenUser tokenUser);

    /**
     * 查询dict
     *
     * @param dictItem  查询结果
     * @param tokenUser 登录用户
     */
    Integer selectDict(DictItemDO dictItem, TokenUser tokenUser);
}


